package com.sky.skyopsserver.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sky.skyopsserver.domain.Notification;
import com.sky.skyopsserver.vos.*;

import java.util.List;

/**
 * 通知信息服务接口
 * 
 * @author Administrator
 * @description 针对表【notification(通知信息表)】的数据库操作Service
 * @createDate 2025-09-13 17:43:04
 */
public interface NotificationService extends IService<Notification> {

    /**
     * 添加通知
     * 
     * @param reqVO 添加通知请求VO
     * @return 通知ID
     */
    Long addNotification(NotificationAddReqVO reqVO);

    /**
     * 更新通知信息
     * 
     * @param reqVO 更新通知请求VO
     * @return 是否更新成功
     */
    Boolean updateNotification(NotificationUpdateReqVO reqVO);

    /**
     * 根据ID删除通知
     * 
     * @param id 通知ID
     * @return 是否删除成功
     */
    Boolean deleteNotification(Long id);

    /**
     * 批量删除通知
     * 
     * @param ids 通知ID列表
     * @return 是否删除成功
     */
    Boolean batchDeleteNotification(List<Long> ids);

    /**
     * 根据ID查询通知详情
     * 
     * @param id 通知ID
     * @return 通知详情
     */
    NotificationRspVO getNotificationById(Long id);

    /**
     * 根据名称查询通知
     * 
     * @param name 通知名称
     * @return 通知信息
     */
    NotificationRspVO getNotificationByName(String name);

    /**
     * 分页查询通知列表
     * 
     * @param reqVO 分页查询请求VO
     * @return 分页结果
     */
    IPage<NotificationRspVO> getNotificationPage(NotificationPageReqVO reqVO);

    /**
     * 查询所有通知选项（用于下拉选择）
     * 
     * @return 通知选项列表
     */
    List<NotificationOptionRspVO> getAllNotificationOptions();

    /**
     * 根据通知方式查询通知选项
     * 
     * @param type 通知方式
     * @return 通知选项列表
     */
    List<NotificationOptionRspVO> getNotificationOptionsByType(String type);

    /**
     * 获取通知统计信息
     * 
     * @return 通知统计信息
     */
    NotificationStatisticsRspVO getNotificationStatistics();

    /**
     * 检查通知名称是否已存在
     * 
     * @param name 通知名称
     * @param excludeId 排除的通知ID（可选）
     * @return 是否存在
     */
    Boolean checkNotificationNameExists(String name, Long excludeId);

    /**
     * 根据名称模糊查询通知
     * 
     * @param name 通知名称关键字
     * @return 通知列表
     */
    List<NotificationRspVO> searchNotificationByName(String name);

    /**
     * 根据通知方式查询通知
     * 
     * @param type 通知方式
     * @return 通知列表
     */
    List<NotificationRspVO> getNotificationsByType(String type);

    /**
     * 验证通知方式是否有效
     * 
     * @param type 通知方式
     * @return 是否有效
     */
    Boolean validateNotificationType(String type);

    /**
     * 验证邮箱格式是否有效
     * 
     * @param email 邮箱地址
     * @return 是否有效
     */
    Boolean validateEmail(String email);

    /**
     * 验证Webhook地址是否有效
     * 
     * @param webhookUrl Webhook地址
     * @return 是否有效
     */
    Boolean validateWebhookUrl(String webhookUrl);

    /**
     * 获取所有通知方式列表
     * 
     * @return 通知方式列表
     */
    List<java.util.Map<String, Object>> getAllNotificationTypes();

    /**
     * 获取所有通知名称列表
     * 
     * @return 通知名称列表
     */
    List<String> getAllNotificationNames();

    /**
     * 测试通知配置
     * 
     * @param id 通知ID
     * @param testMessage 测试消息
     * @return 测试结果
     */
    Boolean testNotification(Long id, String testMessage);

    /**
     * 发送通知
     * 
     * @param id 通知ID
     * @param title 消息标题
     * @param content 消息内容
     * @return 发送结果
     */
    Boolean sendNotification(Long id, String title, String content);

    /**
     * 清理过期通知
     * 
     * @param days 保留天数
     * @return 清理数量
     */
    Long cleanExpiredNotifications(Integer days);
}
